/*
 * io.c
 *
 *  Created on: 09/06/2011
 *      Author: Jonatas Lopes de Paiva
 *
 *  Implementa io.h e mais uma funcao auxiliar.
 */

#include "io.h"

/*
 * Funcao que valida uma entrada. Basicamente a entrada deve ser um inteiro
 * positivo, se nao for um inteiro positivo ela retorna -1.
 * */
int validaEntrada(char* entrada) {
	char accepted[10] = "0123456789";
	if (strspn(entrada, accepted) == strlen(entrada)) {
		return atoi(entrada);
	}
	return -1;
}

/*
 * Le o arquivo e monta o grafo
 * */
Grafo *readFile(char* fileIn) {

	FILE *file = fopen(fileIn, "r");

	if (file == NULL) {
		return NULL;
	}

	Grafo *grafo = criaGrafo();

	char tmp[1024];

	int erro = 0;

	while (1) {

		/*
		 * Le o primeiro vertice
		 * */
		int resp = fscanf(file, "%s", tmp);
		if (resp == EOF) {
			break;
		}

		int vertice1 = validaEntrada(tmp);

		if (vertice1 == -1) {
			erro = 1;
			printf("Aresta invalida, %s.\n", tmp);
			break;
		}

		/*
		 * Le o segundo vertice
		 * */
		resp = fscanf(file, "%s", tmp);
		if (resp == EOF) {
			erro = 1;
			printf("Final de arquivo inesperado.\n");
			break;
		}

		int vertice2 = validaEntrada(tmp);

		if (vertice2 == -1) {
			erro = 1;
			printf("Aresta invalida, %s.\n", tmp);
			break;
		}

		/*
		 * Custo
		 * */
		resp = fscanf(file, "%s", tmp);
		if (resp == EOF) {
			erro = 1;
			printf("Final de arquivo inesperado.\n");
			break;
		}

		int custo = validaEntrada(tmp);

		/*
		 * Custo maximo e 1000, que seria o infinito.
		 * */
		if (custo == -1 || custo > 1000) {
			erro = 1;
			printf("Custo invalido, %s.\n", tmp);
			break;
		}

		if (!insereAresta(vertice1, vertice2, custo, grafo)) {
			erro = 1;
			printf("Aresta repetida, %d, %d, %d.\n", vertice1, vertice2, custo);
			break;
		}

	}

	fclose(file);

	if (erro) {
		destroyGrafo(grafo);
		return NULL;
	}

	return grafo;

}
